/**
 * mobx_bindings.js
 * 提供mobx-miniprogram-bindings的备用实现
 */

// 尝试加载原始模块
let originalBindings;
try {
  originalBindings = require('mobx-miniprogram-bindings');
} catch (e) {
  console.warn('加载mobx-miniprogram-bindings失败，使用备用实现');
  originalBindings = null;
}

/**
 * 创建Store绑定的备用实现
 * @param {Object} context - 页面或组件实例
 * @param {Object} options - 绑定选项
 * @returns {Object} 绑定对象，包含destroyStoreBindings方法
 */
function createStoreBindingsBackup(context, options) {
  if (!context || !options || !options.store) {
    console.error('创建Store绑定失败：参数无效');
    return {
      destroyStoreBindings: () => {}
    };
  }
  
  const { store, fields = [], actions = [] } = options;
  
  // 初始化数据
  const data = {};
  
  // 绑定字段
  fields.forEach(field => {
    // 检查字段是否为函数（getter）
    const value = typeof store[field] === 'function' ? 
                  store[field]() : 
                  store[field];
    
    // 设置到data
    data[field] = value;
  });
  
  // 绑定action
  actions.forEach(action => {
    if (typeof store[action] === 'function') {
      // 创建方法绑定到context
      context[action] = async function(...args) {
        try {
          const result = await store[action].apply(store, args);
          
          // 更新绑定的字段
          fields.forEach(field => {
            const newValue = typeof store[field] === 'function' ? 
                            store[field]() : 
                            store[field];
            
            // 如果值发生变化，更新setData
            if (data[field] !== newValue) {
              data[field] = newValue;
              context.setData({
                [field]: newValue
              });
            }
          });
          
          return result;
        } catch (error) {
          console.error(`执行action ${action}失败:`, error);
          throw error;
        }
      };
    } else {
      console.warn(`Store中不存在action: ${action}`);
    }
  });
  
  // 将初始数据设置到context
  if (Object.keys(data).length > 0) {
    context.setData(data);
  }
  
  // 创建销毁方法
  const destroyStoreBindings = () => {
    // 移除actions绑定
    actions.forEach(action => {
      if (context[action]) {
        context[action] = null;
      }
    });
    
    console.log('Store绑定已销毁');
  };
  
  return {
    destroyStoreBindings
  };
}

/**
 * 导出createStoreBindings函数
 * 优先使用原始模块，失败时使用备用实现
 */
function safeCreateStoreBindings(context, options) {
  try {
    if (originalBindings && originalBindings.createStoreBindings) {
      return originalBindings.createStoreBindings(context, options);
    } else {
      console.warn('使用备用createStoreBindings实现');
      return createStoreBindingsBackup(context, options);
    }
  } catch (error) {
    console.error('createStoreBindings执行失败，使用备用实现:', error);
    return createStoreBindingsBackup(context, options);
  }
}

// 导出函数
module.exports = {
  createStoreBindings: safeCreateStoreBindings,
  
  // 兼容其他可能的导出
  behavior: function() {
    console.warn('mobx behavior备用实现被调用');
    return {};
  }
}; 